import JSEncrypt from "jsencrypt";
import CryptoJS from 'crypto-js';

/**
 * 生成随机AES密钥，使用AES加密password，同时使用公钥加密AES密钥
 * @param password 登录密码
 * @param publicKey 公钥
 * @returns 使用公钥加密后的AES密钥[0],和AES加密的Password[1]
 */
export function getKeyAndPassword(publicKey:string,password:string){
    //1.生成一个随机的AES密钥
    const aesSecret = generateAESKey()
    //2.使用AES加密敏感数据
    const encryptedPasswowrd = encrypt(password, aesSecret)
    //3.使用公钥加密AES密钥
    const rsa2aes = encryptAESKey(publicKey, aesSecret)
    return [rsa2aes.toString(),encryptedPasswowrd]
}


//生成随机的AES密钥
export function generateAESKey(){
    return CryptoJS.lib.WordArray.random(128/8).toString(CryptoJS.enc.Base64)
}

//使用AES加密明文
export function encrypt(message:any,aesSecret:string){
    const key = CryptoJS.enc.Utf8.parse(aesSecret)
    // AES的块大小是128位（16字节），所以只需要前16个字符作为IV
    const iv = CryptoJS.enc.Utf8.parse(aesSecret.slice(0,16))
    const encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(message), key, {  
        iv: iv,  
        mode: CryptoJS.mode.CBC,  
        padding: CryptoJS.pad.Pkcs7  
      }); 
    return encrypted.toString(); // 返回Base64编码的密文  
}

//使用RSA公钥加密AES密钥
export function encryptAESKey(publicKey:string,aesSecret:string){
    const encryptor = new JSEncrypt()
    encryptor.setPublicKey(publicKey)
    return encryptor.encrypt(aesSecret)
}

//使用AES解密
export function decrypt(ciphertext:any,aesSecret:string){
    const key = CryptoJS.enc.Utf8.parse(aesSecret); // 密钥，确保与加密时使用的相同  
    const iv = CryptoJS.enc.Utf8.parse(aesSecret.slice(0, 16));//IV
    // 将密文从Base64转为WordArray 
    const bytes = CryptoJS.AES.decrypt(ciphertext, key, {
        iv: iv,  
        mode: CryptoJS.mode.CBC, // 加密模式，确保与加密时相同  
        padding: CryptoJS.pad.Pkcs7 // 填充方式，确保与加密时相同  
    });
    const originalText = bytes.toString(CryptoJS.enc.Utf8); // 将解密后的WordArray转回字符串
    return originalText;
}